package com.zp.self.module.level_4_算法练习.脑筋急转弯;

import java.util.ArrayList;
import java.util.List;

/**
 * @author By ZengPeng
 */
public class 力扣_54_螺旋矩阵 {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_54_螺旋矩阵().spiralOrder(new int[][]{{1,2,3},{4,5,6},{7,8,9}}));
        System.out.println(new 力扣_54_螺旋矩阵().spiralOrder(new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12}}));
        System.out.println(new 力扣_54_螺旋矩阵().spiralOrder(new int[][]{{1,2,3,4}}));
        System.out.println(new 力扣_54_螺旋矩阵().spiralOrder(new int[][]{{1}}));
        System.out.println(new 力扣_54_螺旋矩阵().spiralOrder(new int[][]{{1},{2},{3},{4},{5},{6}}));
    }

    /**
    题目：给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。

     示例 1：
     输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
     输出：[1,2,3,6,9,8,7,4,5]

     示例 2：
     输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
     输出：[1,2,3,4,8,12,11,10,9,5,6,7]

    分析：【perfect】
       1.位图记录走过的点，转向标准左右？  上下？
        2.变量记录第几圈，注意不要重复访问

    边界值 & 注意点：
       1.
     **/
    public List<Integer> spiralOrder(int[][] matrix) {
//        boolean[][] b = new boolean[matrix.length][matrix[0].length];
        int i = 0,rowLen = matrix.length-1,clownLen = matrix[0].length-1;
        List<Integer> res = new ArrayList<>();
        while (i<=rowLen/2 && i<=clownLen/2){
            //向右 带上最右
            for (int j = i; j <= clownLen-i; j++) {
                res.add(matrix[i][j]);
            }
//            System.out.println(res);
            //向下 不带起点 ，带上终点
            for (int j =i+1 ; j <=rowLen-i; j++) {
                res.add(matrix[j][clownLen-i]);
            }
//            System.out.println(res);
            //向左 不带起点 ，带上终点. 注意这一列有没有被读取过？
            if(rowLen-i !=i){
                for (int j = clownLen-i-1; j >=i; j--) {
                    res.add(matrix[rowLen-i][j]);
                }
            }
//            System.out.println(res);
            //向上 不带起点 ，不带终点 . 注意这一行有没有被读取过？
            if(clownLen-i !=i) {
                for (int j =rowLen-i-1 ; j>i; j--) {
                    res.add(matrix[j][i]);
                }
            }
//            System.out.println(res);
            i++;
        }
        return res;
    }
}
